package com.open.common.model.po;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;

/**
 * 分页类
 */
public class Page<T> {

	private int pageNo = 1; // 当前页码

	private int pageSize = 20; // 页面大小，设置为“-1”表示不进行分页（分页无效）

	private long total;// 总记录数，设置为“-1”表示不查询总数

	private int offset; // 返回记录的开始位置

	private int limit; // 返回记录的数量

	private List<T> rows = new ArrayList<T>();

	public Page() {
		this.pageSize = -1;
	}

	/**
	 * 构造方法
	 * 
	 * @param pageNo 当前页码
	 * @param pageSize 分页大小
	 */
	public Page(int pageNo, int pageSize) {
		this(pageNo, pageSize, 0);
	}

	/**
	 * 构造方法
	 * 
	 * @param pageNo 当前页码
	 * @param pageSize 分页大小
	 * @param count 数据条数
	 */
	public Page(int pageNo, int pageSize, long count) {
		this(pageNo, pageSize, count, new ArrayList<T>());
	}

	/**
	 * 构造方法
	 * 
	 * @param pageNo 当前页码
	 * @param pageSize 分页大小
	 * @param total 数据条数
	 * @param rows 本页数据对象列表
	 */
	public Page(int pageNo, int pageSize, long total, List<T> rows) {
		this.setTotal(total);
		this.setPageNo(pageNo);
		this.pageSize = pageSize;
		this.rows = rows;
	}

	// 获取设置总数
	public long getTotal() {
		return total;
	}

	// 设置数据总数
	public void setTotal(long total) {
		this.total = total;
		if (pageSize >= total) {
			pageNo = 1;
		}
	}

	public int getOffset() {
		return offset;
	}

	public void setOffset(int offset) {
		this.offset = offset;
	}

	public int getLimit() {
		return limit;
	}

	public void setLimit(int limit) {
		this.limit = limit;
	}

	/**
	 * 获取当前页码
	 * 
	 * @return
	 */
	public int getPageNo() {
		return pageNo;
	}

	/**
	 * 设置当前页码
	 * 
	 * @param pageNo
	 */
	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}

	/**
	 * 获取页面大小
	 * 
	 * @return
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 设置页面大小（默认20）
	 * 
	 * @param pageSize
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize <= 0 ? 20 : pageSize;
	}

	// 获取本页数据对象列表
	public List<T> getRows() {
		return rows;
	}

	// 设置本页数据对象列表
	public Page<T> setRows(List<T> rows) {
		this.rows = rows;
		return this;
	}

	@Override
	public String toString() {
		return ReflectionToStringBuilder.toString(this);
	}
}
